from PIL import Image
import numpy as np
import os

from PIL.Image import Resampling
from scipy.ndimage import gaussian_filter

from PIL import Image, ImageDraw, ImageColor, ImageFilter


def paste_soft_circle_on_image(x, y, width, height, pilImage, pasteColor, feather=0):
    """
    在 pilImage 上绘制一个带羽化边缘的纯色圆形。

    :param x: 起点 x 坐标（圆形左上角）
    :param y: 起点 y 坐标
    :param width: 圆形宽度
    :param height: 圆形高度
    :param pilImage: PIL.Image 图像对象
    :param pasteColor: 粘贴颜色（RGB/RGBA 元组或字符串）
    :param feather: 羽化程度（推荐 0~30），越大越柔和
    :return: 返回处理后的新图像
    """
    base = pilImage.convert("RGBA").copy()
    img_w, img_h = base.size

    # 限制绘制区域不越界（仅控制中心，不限制羽化外溢）
    x1 = max(0, x)
    y1 = max(0, y)
    x2 = min(img_w, x + width)
    y2 = min(img_h, y + height)

    if x1 >= x2 or y1 >= y2:
        return base

    # 计算羽化用的边缘扩展尺寸
    padding = feather * 2 if feather > 0 else 0
    mask_w = width + padding * 2
    mask_h = height + padding * 2

    # 创建遮罩和颜色图层（比原区域大）
    mask = Image.new("L", (mask_w, mask_h), 0)
    draw = ImageDraw.Draw(mask)
    draw.ellipse([padding, padding, padding + width, padding + height], fill=255)

    if feather > 0:
        mask = mask.filter(ImageFilter.GaussianBlur(radius=feather))

    # 标准化颜色
    try:
        color = ImageColor.getcolor(pasteColor, "RGBA")
    except:
        if isinstance(pasteColor, tuple):
            color = pasteColor[:4] if len(pasteColor) == 4 else pasteColor[:3] + (255,)
        else:
            raise ValueError("Invalid pasteColor format")

    # 创建纯色图层
    color_layer = Image.new("RGBA", (mask_w, mask_h), color)

    # 粘贴到原图上的位置（减去 padding 还原目标位置）
    paste_pos = (x - padding, y - padding)

    base.paste(color_layer, paste_pos, mask)

    return base


# 使用示例
if __name__ == "__main__":
    # 示例用法
    input_image_path = (
        r"N:\trainData\衣服\ComfyUI_temp_xqbdm_00005_.png"  # 替换为你的输入图片路径
    )
    input_image_path2 = (
        r"N:\trainData\衣服\output.png"  # 替换为你的输入图片路径
    )
    output_image_path = r"N:\trainData\衣服\output.png"  # 替换为你想保存的输出图片路径

    # 假设你已经有了一些打开的Image对象存储在images列表中
    images = [Image.open(input_image_path), Image.open(input_image_path2)]  # 示例路径
    target_width = 1024
    target_height = 1024
    direction = 'vertical'  # 或者 'vertical'

    result_image = paste_soft_circle_on_image(pilImage=images[0], x=0, y=0, width=100, height=100, pasteColor=(255, 0, 0, 128),feather=5)
    result_image.save(output_image_path)  # 保存结果图像
    # img.show()
